<?php
	/**
	  * @package	MySQLWrapper
	  * @name		MySQLProcess
	  * @brief		Clase para ejecutar procesos en un servidor MySQL (Solo procesos)
	  * @author		Hermann D. Schimpf <hschimpf@gschimpf.com>
	  * @license	http://opensource.org/licenses/gpl-2.0.php
	  * @date		2009-12-30
	  * @version	0.1.1
  	**/

	class MySQLProcess extends MySQLLink implements SQLBasics, MyVersions {
		/* version de la clase */
		private static $version			= 0;
		/* subversion de la clase */
		private static $subversion		= 1;
		/* numero de revision de la clase */
		private static $revision		= 1;

		/* cadena donde armaremos la consulta temporal */
		protected $sqlString		= False;
		/* ultimo SQL ejecutado	*/
		protected $sqlResult		= False;
		/* cantidad de filas affectadas */
		protected $affected		= False;

		public function __construct($debug = False, $name = __CLASS__) {
			/* enviamos el constructor del padre */
			parent::__construct($debug, $name);
		}

		public function __destruct() {
			/* enviamos el destructor padre */
			parent::__destruct();
		}

		public static function getVersion() {
			/* retornamos la version actual de la clase */
			return 'v' . self::$version . '.' . self::$subversion . '.' . self::$revision;
		}

		public final function ejecutarSQL($sqlString = Null) {
			try {
				try {
					/* mostramos un mensaje */
					$this->show('Ejecutando consulta SQL..', False);
					/* realizamos unas verificaciones */
					$this->verificacionesEjecutarSQL($sqlString);
					/* verificamos si se especifico la consulta en el parametro */
					if ($sqlString !== Null)
						/* almacenamos la consulta */
						$this->saveValue('sqlString', $sqlString);
					/* ejecutamos el sql */
					$this->runSQL();
					/* mostramos ok al mensaje */
					$this->showOK();
				} catch (Exception $e) {
					/* convertimos la excepcion a mi excepcion */
					$this->newException($e);
				}
			} catch (MyException $e) {
				/* comstramos el mensaje */
				$this->show($e->getMensaje());
			}
		}

		public final function getResultadoSQL() {
			try {
				try {
					/* mostramos un mensaje */
					$this->show('Enviando resultados de la consulta..', False);
					/* realizamos algunas verificaciones */
					$this->verificacionesResultadoSQL();
					/* obtenemos el resultado de la consulta */
					$resultado = mysql_fetch_object($this->getSqlResult());
					/* mostramos ok al mensaje */
					$this->showOK();
					/* retornamos el resultado */
					return $resultado;
				} catch (Exception $e) {
					/* convertimos la excepcion a mi excepcion */
					$this->newException($e);
				}
			} catch (MyException $e) {
				/* comstramos el mensaje */
				$this->show($e->getMensaje());
			}
		}

		public final function getNumRows() {
			try {
				try {
					/* mostramos un mensaje */
					$this->show('Enviando cantidad de filas de la ultima consulta..', False);
					/* realizamos algunas verificaciones */
					$this->verificacionesNumRows();
					/* obtenemos la cantidad de filas afectadas / obtenidas */
					$cantFilas = (
						/* verificamos si la consulta retorno filas afectadas */
						$this->getValue('affected') === False ?
						/* obtenemos la cantidad de filas obtenidas */
						mysql_num_rows($this->getSqlResult()) :
						/* obtenemos la cantidad de filas affectadas */
						$this->getValue('affected')
					);
					/* mostramos ok al mensaje */
					$this->showOK();
					/* retornamos la cantidad de filas */
					return $cantFilas;
				} catch (Exception $e) {
					/* convertimos la excepcion a mi excepcion */
					$this->newException($e);
				}
			} catch (MyException $e) {
				/* comstramos el mensaje */
				$this->show($e->getMensaje());
			}
		}

		protected final function existeSQL() {
			/* retornamos True si hay un SQL */
			return (
				/* verificamos si existe una consulta */
				$this->getSqlString() === False ?
				/* retornamos FALSE */
				False :
				/* retornamos TRUE */
				True
			);
		}

		protected function consultaSinEjecutar($sqlString) {
			/* verificamos si hay un SQL que no se ejecuto y se especifico un nuevo SQL */
			if ($sqlString !== Null && $this->getSqlString() !== False)
				/* mostramos un mensaje */
				$this->show($this->red('Se sobreescribe el SQL no ejecutado..'), False);
		}

		protected function getSqlString() {
			/* retornamos la consulta temporal */
			return $this->getValue('sqlString');
		}

		private function verificacionesEjecutarSQL($sqlString) {
			/* verificamos si hay una conexion abierta */
			$this->verificarConexion();
			/* verificamos si hay una db seleccionada */
			if ($this->dbSelected() === False && (!stristr($sqlString, 'create') && !stristr($sqlString, 'alter')))
				/* salimos con una excepcion */
				$this->newException('No hay una Base de Datos seleccionada');
			/* verificamos si hay una consulta para ejecutar */
			if ($sqlString === Null && $this->getSqlString() === False)
				/* salimos con una excepcion */
				$this->newException('No existe una consulta para ejecutar');
			/* verificamos si hay una consulta sin ejecutar */
			$this->consultaSinEjecutar($sqlString);
		}

		private function verificacionesResultadoSQL() {
			/* verificamos si existe una conexion abierta */
			$this->verificarConexion();
			/* verificamos si hay una consulta activa */
			if ($this->getSqlResult() === False)
				/* salimos con una excepcion */
				$this->newException('No existe una consulta activa');
		}

		private function verificacionesNumRows() {
			/* verificamos si existe una conexion abierta */
			$this->verificarConexion();
			/* verificamos si hay una consulta activa */
			if ($this->getSqlResult() === False && $this->getValue('affected') === False)
				/* salimos con una excepcion */
				$this->newException('No existe una consulta activa');
		}

		private function runSQL() {
			/* mostramos el sql a ejecutar */
			$this->show('(' . $this->blue($this->italic($this->getSqlString())) . ')..', False);
			/* ejecutamos la consulta */
			$this->saveValue('sqlResult', mysql_query($this->getSqlString(), $this->getLink()));
			/* verificamos si la consulta se ejecuto correctamente */
			if ($this->getSqlResult() === False)
				/* salimos con una excepcion */
				$this->newException('La consulta no se pudo ejecutar: ' . mysql_error());
			/* verificamos el tipo de dato retornado por la consulta */
			if (gettype($this->getSqlResult()) !== 'boolean')
				/* vaciamos la cantidad de filas adectadas */
				$this->saveValue('affected', False);
			else {
				/* obtenemos la cantidad de filas afectadas */
				$this->saveValue('affected', mysql_affected_rows());
				/* vaciamos el resultado del sql */
				$this->saveValue('sqlResult', False);
			}
			/* vaciamos el atributo con el sql temporal */
			$this->saveValue('sqlString', False);
		}

		private function getSqlResult() {
			/* retornamos el resultado de la consulta */
			return $this->getValue('sqlResult');
		}
	}
?>